#include <string.h>





	
int cs_sqlspguardar_body_generator(FILE *farchivo, struct st_model *model)
{
	struct st_property_ls *properties;
	
	fprintf(farchivo,"\tBEGIN TRY\n");
	fprintf(farchivo,"\t\tBEGIN TRAN guardar%s\n",model->name);
	fprintf(farchivo,"\t\tSET  @var_tmp=-1\n");
	fprintf(farchivo,"\t\tSET  @ret_error =0\n");
	fprintf(farchivo,"\t\tIF @id = -1\n");
	fprintf(farchivo,"\t\tBEGIN\n");
	fprintf(farchivo,"\t\t\tSELECT id FROM %s  WHERE id like @id\n",model->name);
	fprintf(farchivo,"\t\t\tIF @@rowcount = 0\n");
	fprintf(farchivo,"\t\t\tBEGIN\n");
	
	
	fprintf(farchivo,"\t\t\t\tINSERT INTO %s",model->name);
	fprintf(farchivo,"(");
	properties=model->properties;
	if(properties!=NULL)
		properties = properties->next;
	while(properties!=NULL)
	{
		fprintf(farchivo,"%s",properties->property->name);
		if(properties->next!=NULL) 
			fprintf(farchivo,",");
		properties=properties->next;
	}
	fprintf(farchivo,") ");
	
	fprintf(farchivo,"VALUES(");
	properties=model->properties;
	if(properties!=NULL)
		properties = properties->next;
	while(properties!=NULL)
	{
		fprintf(farchivo,"@%s",properties->property->name);
		if(properties->next!=NULL) 
			fprintf(farchivo,",");
		properties=properties->next;
	}
	fprintf(farchivo,")\n");
	fprintf(farchivo,"\t\t\t\tSET @id = SCOPE_IDENTITY\n");
	fprintf(farchivo,"\t\t\tEND\n");
	fprintf(farchivo,"\t\t\tELSE\n");
	fprintf(farchivo,"\t\t\tBEGIN\n");
	fprintf(farchivo,"\t\t\t\tSELECT  @ret_error = id FROM codigosretorno cod WHERE cod.valor like 'REGISTRO EXISTENTE'\n");
	fprintf(farchivo,"\t\t\tEND\n");
	fprintf(farchivo,"\t\tEND\n");
	
	fprintf(farchivo,"\t\tELSE\n");
	fprintf(farchivo,"\t\tBEGIN\n");
	
	fprintf(farchivo,"\t\t\tUPDATE %s SET ",model->name);
	properties=model->properties;
	if(properties!=NULL)
		properties = properties->next;
	while(properties!=NULL)
	{
		fprintf(farchivo,"%s = @%s",properties->property->name,properties->property->name);
		if(properties->next!=NULL) 
			fprintf(farchivo,", ");
		properties=properties->next;
	}				
	fprintf(farchivo," where id= @id\n");
	fprintf(farchivo,"\t\tEND\n");
	fprintf(farchivo,"\t\tIF @@error = 0 AND @ret_error =0\n");
	fprintf(farchivo,"\t\tBEGIN\n");
	fprintf(farchivo,"\t\t\tCOMMIT TRAN guardar%s\n",model->name);
	fprintf(farchivo,"\t\tEND\n");
	fprintf(farchivo,"\t\tELSE\n");
	fprintf(farchivo,"\t\tBEGIN\n");
	fprintf(farchivo,"\t\t\tROLLBACK TRAN guardar%s\n",model->name);
	fprintf(farchivo,"\t\t\tIF @ret_error = 0\n");
	fprintf(farchivo,"\t\t\t\tSELECT  @ret_error = id FROM codigosretorno cod WHERE cod.valor like 'ERROR INESPERADO'\n");
	fprintf(farchivo,"\t\t\tEND\n");		
	fprintf(farchivo,"\t\tEND TRY\n");
	fprintf(farchivo,"\tEND TRY\n");
	fprintf(farchivo,"\tBEGIN CATCH\n");
	fprintf(farchivo,"\t\tBEGIN TRY\n");
	fprintf(farchivo,"\t\t\tROLLBACK TRAN guardar%s\n",model->name);
	fprintf(farchivo,"\t\tEND TRY\n");
	fprintf(farchivo,"\t\tBEGIN CATCH\n");
	fprintf(farchivo,"\t\t\tSELECT @@error\n");
	fprintf(farchivo,"\t\tEND CATCH\n");
	fprintf(farchivo,"\t\tSELECT  @ret_error = id FROM codigosretorno cod WHERE cod.valor like 'ERROR INESPERADO'\n");
	fprintf(farchivo,"\tEND CATCH\n");
	fprintf(farchivo,"\tSET @detalle=@detalle+'  Codigo de Error='+cast(@@error as varchar)\n");
	fprintf(farchivo,"\texec sp_add_suceso @fecha,@usrAlta,@sistema,@host,@ip,'Guardar Usuario',@ret_error,@detalle\n");
	fprintf(farchivo,"END\n\n");
	return OK;
}

int cs_sqlspguardar_init_generator(FILE *farchivo, struct st_model *model)
{
	struct st_property_ls *properties = model->properties;
	struct st_property *property;
	fprintf(farchivo,"BEGIN\n");
	fprintf(farchivo,"\tSET NOCOUNT ON;\n");
	fprintf(farchivo,"\tDECLARE @var_tmp INT\n");
	fprintf(farchivo,"\tDECLARE @fecha DATETIME\n");
	fprintf(farchivo,"\tDECLARE @detalle varchar(2024)\n");
	fprintf(farchivo,"\tSET @fecha = getdate()\n");
	fprintf(farchivo,"\tSET @detalle = 'COMANDO: SP_%s_GUARDAR @id='+ cast(@id as varchar)",model->name);
	
	while(properties!=NULL)
	{
		property= properties->property;
		if(is_primitive_type(property))
			fprintf(farchivo,"\tSET @detalle = @detalle+', @%s='+ cast( @%s as varchar)\n",property->name,property->name);
		else 
			fprintf(farchivo,"\tSET @detalle = @detalle+', @%s_id='+ cast( @%s_id as varchar)\n",property->name,property->name);
		properties=properties->next;
	}

	fprintf(farchivo,"\tSET @detalle = @detalle+', @usrAlta='+ cast(@usrAlta as varchar)\n"); 
	fprintf(farchivo,"\tSET @detalle = @detalle+', @sistema='+ cast(@sistema as varchar)\n"); 
	fprintf(farchivo,"\tSET @detalle = @detalle+', @ip='+ @ip\n");
	fprintf(farchivo,"\tSET @detalle = @detalle+', @host='+ @host\n");
	fprintf(farchivo,"\tSET @detalle = @detalle+', @ret_error='+cast(@ret_error as varchar)\n"); 
	return OK;	
}
int cs_sqlspguardar_parameter_generartor(FILE *farchivo, struct st_model *model)
{
	struct st_property_ls *properties = model->properties;
	struct st_property *property;
	
	while(properties!=NULL)
	{
		property= properties->property;
		if(strcmp(property->type,"String")==0 || strcmp(property->type,"string")==0)
			fprintf(farchivo,"\t@%s varchar(500),\n",property->name);
		else if(strcmp(property->type,"double")==0 || strcmp(property->type,"Double")==0)
			fprintf(farchivo,"\t@%s numeric(18,2),\n",property->name);
		else if(strcmp(property->type,"DateTime")==0 || strcmp(property->type,"Date")==0)
			fprintf(farchivo,"\t@%s datetime,\n",property->name);
		else if(strcmp(property->type,"int")==0 || strcmp(property->type,"Int")==0)
			fprintf(farchivo,"\t@%s int,\n",property->name);
		else if(strcmp(property->type,"bool")==0 || strcmp(property->type,"Boolean")==0)
			fprintf(farchivo,"\t@%s bit,\n",property->name);
		else 
			fprintf(farchivo,"\t@%s_id int,\n",property->name);
		properties=properties->next;
	}
	fprintf(farchivo,"\t@usrAlta int,\n");
	fprintf(farchivo,"\t@sistema int,\n");
	fprintf(farchivo,"\t@ip varchar(20),\n");
	fprintf(farchivo,"\t@ret_error int out\n");
	return OK;
}
int cs_sqlspguardar_generator( struct st_model *model)
{
	FILE *farchivo;
	char archivo[100];
	char strmodel[100]="";
	int error=OK;
	if(model==NULL)
		return INVALID_MODEL;
	else{
		sprintf(archivo,"%s.sp_%s_guardar.sql",NAMESPACE,model->name);
		farchivo=fopen(archivo, "w");
		printf("Inicia codificacion de %s\n",archivo);
		fprintf(farchivo,"SET ANSI_NULLS ON\nGO\nSET QUOTED_IDENTIFIER ON\nGO\n");
		fprintf(farchivo,"CREATE PROCEDURE sp_%s_guardar\n",model->name);
		cs_sqlspguardar_parameter_generartor(farchivo,model);
		fprintf(farchivo,"AS\n");
		cs_sqlspguardar_init_generator(farchivo,model);
		cs_sqlspguardar_body_generator(farchivo,model);
		fflush(farchivo);
		fclose(farchivo);
		printf("Finaliza codificacion de %s\n\n",archivo);
	}
}


int cs_models_sqlspguardar_generator( struct st_model_ls *models){
	while(models!=NULL)
	{
	 	cs_sqlspguardar_generator(models->model);
	 	
	 	models=models->next;
	 }
	 return OK;	
}

